package com.example.baiduapi.Controller;

import cn.dev33.satoken.stp.StpUtil;
import com.example.baiduapi.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * Sa-Token 权限测试接口
 */
@RestController
@RequestMapping("/auth")
@CrossOrigin
@Slf4j
public class AuthTestController {

    /**
     * 测试公开接口（不需要登录）
     * 此接口在 SaTokenConfig 中需要配置为排除路径
     */
    @GetMapping("/public/hello")
    public AjaxResult publicHello() {
        return AjaxResult.success("这是公开接口，不需要登录即可访问");
    }

    /**
     * 测试需要登录的接口
     */
    @GetMapping("/private/hello")
    public AjaxResult privateHello() {
        // 获取当前登录的用户ID
        Object loginId = StpUtil.getLoginId();
        Map<String, Object> data = new HashMap<>();
        data.put("message", "这是需要登录才能访问的接口");
        data.put("loginUserId", loginId);
        log.info("用户 {} 访问了需要登录的接口", loginId);
        return AjaxResult.success("访问成功", data);
    }

    /**
     * 获取当前登录用户信息
     */
    @GetMapping("/userInfo")
    public AjaxResult getUserInfo() {
        // 检查是否登录
        boolean isLogin = StpUtil.isLogin();
        if (!isLogin) {
            return AjaxResult.error("未登录");
        }

        // 获取登录用户ID
        Object loginId = StpUtil.getLoginId();

        // 获取 token 信息
        String tokenValue = StpUtil.getTokenValue();

        // 获取 token 剩余有效期
        long tokenTimeout = StpUtil.getTokenTimeout();

        Map<String, Object> data = new HashMap<>();
        data.put("loginId", loginId);
        data.put("token", tokenValue);
        data.put("tokenTimeout", tokenTimeout);
        data.put("isLogin", true);

        log.info("获取用户信息成功: {}", loginId);
        return AjaxResult.success("获取成功", data);
    }

    /**
     * 测试登录状态
     */
    @GetMapping("/checkLogin")
    public AjaxResult checkLogin() {
        boolean isLogin = StpUtil.isLogin();
        Map<String, Object> data = new HashMap<>();
        data.put("isLogin", isLogin);
        if (isLogin) {
            data.put("loginId", StpUtil.getLoginId());
        }
        return AjaxResult.success("检查完成", data);
    }

    /**
     * 测试强制下线
     */
    @PostMapping("/kickout/{userId}")
    public AjaxResult kickout(@PathVariable String userId) {
        // 强制指定用户下线
        StpUtil.kickout(userId);
        log.info("用户 {} 已被强制下线", userId);
        return AjaxResult.success("用户已被强制下线");
    }
}
